1 module tests.student; 2 3 import db_constraints; 4 5 version(unittest) 6 class Student 7 { 8 private: 9 string _cName; 10 int _nNumClasses; 11 public: 12 @PrimaryKeyColumn @NotNull 13 @property string cName() const nothrow pure @safe @nogc 14 { 15 return _cName; 16 } 17 @CheckConstraint!("a.length < 13") 18 @property void cName(immutable(char)[] value) 19 { 20 setter(_cName, value); 21 } 22 @property int nNumClasses() const nothrow pure @safe @nogc 23 { 24 return _nNumClasses; 25 } 26 @UniqueConstraintColumn!("uc_Student") 27 @property void nNumClasses(immutable(int) value) 28 { 29 setter(_nNumClasses, value); 30 } 31 32 this(string pcName, immutable(int) pnNumClasses) 33 { 34 35 this._cName = pcName; 36 this._nNumClasses = pnNumClasses; 37 38 initializeKeyedItem(); 39 } 40 Student dup() const 41 { 42 return new Student(this._cName, this._nNumClasses); 43 } 44 45 bool isValid() const nothrow pure @safe @nogc 46 { 47 if (this._cName.length > 13) 48 { 49 return false; 50 } 51 return true; 52 } 53 void printInfo() 54 { 55 import std.stdio: writeln; 56 writeln("cName = ", cName, 57 ", nNumClasses = ", nNumClasses); 58 } 59 override string toString() 60 { 61 return this.cName; 62 } 63 override int opCmp(Object o) const 64 { 65 if (typeid(this) != typeid(o)) 66 { 67 return typeid(this).opCmp(typeid(o)); 68 } 69 auto rhs = cast(immutable Student)o; 70 return this.key.opCmp(rhs.key); 71 } 72 override bool opEquals(Object o) const pure nothrow @nogc 73 { 74 auto rhs = cast(immutable Student)o; 75 return (rhs !is null && this.key == rhs.key); 76 } 77 mixin KeyedItem!(); 78 } 79 80 unittest 81 { 82 auto i = new Student("Tom", 8); 83 assert(i.isValid); 84 } 85 /// 86 unittest 87 { 88 auto i = new Student("Tom", 8); 89 assert(!i.containsChanges); 90 i.cName = "What"; 91 assert(i.containsChanges); 92 i.markAsSaved(); 93 assert(!i.containsChanges); 94 } 95 unittest 96 { 97 auto i = new Student("Tom", 0); 98 auto j = new Student("Jake", 7); 99 assert(i != j); 100 assert(i > j); 101 } 102 unittest 103 { 104 auto i = Student.PrimaryKey("Jean"); 105 assert(i.cName == "Jean"); 106 assert(typeid(i.cName) == typeid(string)); 107 auto j = new Student("Tom", 8); 108 assert(i != j.key); 109 j.cName = "Jean"; 110 assert(i == j.key); 111 } 112 unittest 113 { 114 auto i = new Student("Tom", 0); 115 auto j = new Student("Tom", 7); 116 assert(i == j); 117 } 118 unittest 119 { 120 auto i = new Student("Tom", 0); 121 auto j = new Student("Jake", 0); 122 assert(i.key != j.key); 123 assert(i != j); 124 assert(i.uc_Student_key == j.uc_Student_key); 125 } 126 127 128 version(unittest) 129 alias Students = BaseKeyedCollection!(Student); 130 131 unittest 132 { 133 auto i = new Students(new Student("Tom", 7)); 134 assert(i.length == 1); 135 } 136 unittest 137 { 138 auto i = new Students(new Student("Tom", 7)); 139 assert(!i.containsChanges); 140 i ~= new Student("Jon", 8); 141 assert(i.length == 2); 142 assert(i.containsChanges); 143 i.markAsSaved(); 144 assert(!i.containsChanges); 145 } 146 unittest 147 { 148 auto i = new Students(new Student("Tom", 7)); 149 auto j = new Student("Tom", 8); 150 assert(i[cast(Student.PrimaryKey)"Tom"] == j); 151 auto k = new Student("Jake", 5); 152 assert(i[Student.PrimaryKey("Tom")] != k); 153 } 154 155 unittest 156 { 157 auto i = new Students(new Student("Tom", 7)); 158 auto j = new Student("Tom", 8); 159 auto Tom = Student.PrimaryKey("Tom"); 160 assert(i[Tom] == j); 161 auto k = new Student("Jake", 5); 162 assert(i[Tom] != k); 163 } 164 165 unittest 166 { 167 auto i = new Students(new Student("Tom", 7)); 168 i ~= new Student("Jake", 5); 169 assert(i.length == 2); 170 auto Tom = Student.PrimaryKey("Tom"); 171 assert(Tom in i); 172 auto j = i[Tom]; 173 j.cName = "Tommy"; 174 assert(i.length == 2); 175 auto Tommy = Student.PrimaryKey("Tommy"); 176 assert(Tommy in i); 177 auto k = i[Tommy]; 178 auto l = new Student("Tommy", 7); 179 assert(l == k); 180 } 181 182 unittest 183 { 184 auto i = new Students(new Student("Tom", 7)); 185 i ~= new Student("Jake", 5); 186 foreach(mykey, myvalue; i) 187 { 188 assert(i[mykey] == myvalue); 189 } 190 auto j = new Student("Jake", 5); 191 assert(i.contains(j.key)); 192 assert(i.contains(j)); 193 assert(j in i); 194 195 import std.exception : assertThrown; 196 assertThrown!UniqueConstraintException(i ~= j); 197 } 198 199 unittest 200 { 201 auto i = new Students(new Student("Tom", 7)); 202 auto jake = new Student("Jake", 7); 203 import std.exception : assertThrown; 204 assertThrown!UniqueConstraintException(i.add(jake)); 205 jake.nNumClasses = 5; 206 i.add(jake); 207 assertThrown!UniqueConstraintException(i["Jake"].nNumClasses = 7); 208 } 209 210 unittest 211 { 212 auto i = new Students(new Student("Tom", 7)); 213 auto jake = new Student("Jake", 7); 214 import std.exception : assertThrown, assertNotThrown; 215 assertThrown!UniqueConstraintException(i.add(jake)); 216 jake.nNumClasses = 5; 217 i.add(jake); 218 assertNotThrown!UniqueConstraintException(i["Jake"].nNumClasses = 6); 219 assertThrown!KeyedException(i["Sup"].nNumClasses = 9); 220 } 221 222 unittest 223 { 224 import std.exception : assertThrown, assertNotThrown; 225 226 auto tom1 = new Student("Tom", 7); 227 auto tom2 = new Student("Tom", 7); 228 auto i = new Students(tom1); 229 assert(i.length == 1); 230 string j; 231 assert(i.violatesUniqueConstraints(tom2, j)); 232 assert(j == "PrimaryKey, uc_Student"); 233 assert(!i.violatesUniqueConstraints(tom1)); 234 assertNotThrown!UniqueConstraintException(i.add(tom1)); 235 assertThrown!UniqueConstraintException(i.add(tom2)); 236 assert(i.length == 1); 237 tom2.cName = "James"; 238 assertThrown!UniqueConstraintException(i.add(tom2)); 239 i.enforceConstraints = Enforce.clusteredUnique; 240 assertNotThrown!UniqueConstraintException(i.add(tom2)); 241 assert(i.length == 2); 242 foreach(item; i) 243 { 244 assert(i[item.key] == item); 245 } 246 auto tom3 = new Student("Tom", 2); 247 assertThrown!UniqueConstraintException(i.add(tom3)); 248 }